/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Util;

import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Moneda;

/**
 *
 * @author pedro
 */
public class Calculo {
    
   public double Distancia(Ciudad O, Ciudad F)
   {
       Posicion Igualada= new Posicion(O.getLatitud(), O.getAltitud());
       Posicion Granada = new Posicion(F.getLatitud(), F.getAltitud());
       Extensiones e = new Extensiones();
       double distancia = e.DistanciaKm(Igualada,Granada);
       return distancia;
   }
   public double CalculaTarifa(double distancia){
       double tarifa;
       if (distancia < 3719){
           tarifa = 8;           
       }
       else if(distancia < 7436){
           tarifa = 17;
       }
       else if(distancia < 11154){
           tarifa = 33;
       }
       else if(distancia < 14871){
           tarifa = 66;
       }
       else {
           tarifa = 133;
       }       
       return tarifa;       
   }

   public double obtieneTarifa(Ciudad origen, Ciudad destino, Moneda mon){             
        return TarifaTipodeCambio(CalculaTarifa(Distancia(origen, destino)), mon);              
   }
   
   
    public double TarifaTipodeCambio(double costo, Moneda mon) {
        //costo en dolares, moneda tiene tipo de cambio, ekis*cambio = dolar, con ekis monto
        //para hallar ekis, ekis = valor en dolares / tipo de cambio.                
        return costo/mon.getCambio();
    }
    
   public class Extensiones
   {
        public final double RadioTierraKm = 6378.0;
        
        public double  DistanciaKm(Posicion posOrigen, Posicion posDestino)
        {
            //Fórmula del Haversine:
            double difLatitud = EnRadianes((posDestino.getLatitud() - posOrigen.getLatitud()));
            double difLongitud =EnRadianes((posDestino.getLongitud() -posOrigen.getLongitud()));

            double a = AlCuadrado(Math.sin(difLatitud/2))+
                    EnRadianes(Math.cos(posOrigen.getLatitud()))*
                    EnRadianes(Math.cos(posDestino.getLatitud()))*
                    AlCuadrado(Math.sin(difLongitud/2));
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            return RadioTierraKm * c;            
        }
        
        double EnRadianes(double valor)
        {
            return (Math.PI / 180) * valor;
        }

        double AlCuadrado(double valor)
        {
            return Math.pow(valor, 2);
        }        
    }
    
   public class Posicion
   {
        public Posicion(double latitud, double longitud)
        {
            Latitud = latitud;
            Longitud = longitud;
        }
        private double Latitud;
        private double Longitud;

        /**
         * @return the Latitud
         */
        public double getLatitud() {
            return Latitud;
        }

        /**
         * @param Latitud the Latitud to set
         */
        public void setLatitud(double Latitud) {
            this.Latitud = Latitud;
        }

        /**
         * @return the Longitud
         */
        public double getLongitud() {
            return Longitud;
        }

        /**
         * @param Longitud the Longitud to set
         */
        public void setLongitud(double Longitud) {
            this.Longitud = Longitud;
        }
    }
   
}
